/*
 * BSP_sha.h
 *
 *  Created on: 2023年7月5日
 *      Author: fjx
 */

#ifndef BSP_SHA_H_
#define BSP_SHA_H_
#include "psa/crypto.h"

typedef enum {
  DS_SHA_STATUS_SUCCESS = 0,
  DS_SHA_STATUS_FAIL = -1,
  DS_SHA_STATUS_ERROR_NOT_SUPPORTED = -2,
}DS_SHA_STATUS;

typedef enum {
  HASH_SHA1     = 0x01,

  HASH_SHA2_224 = 0x20,
  HASH_SHA2_256,
  HASH_SHA2_384,
  HASH_SHA2_512,

  //SHA3 NOT SUPPORTED
  HASH_SHA3_256 = 0x31,
  HASH_SHA3_512,

}SHA_Type_t;

/*
 *
 *@brief 单个数据流进行hash计算，支持sha1,sha224,sha256,sha384,sha512,
 *@brief 暂不支持sha3_256,sha3_512等算法
 *@param type  hash算法类型，支持sha1,sha224,sha256,sha384,sha512。
 *@param input 待hash的数据buffer
 *@param input_length hash的数据长度
 *@param hash hash值buffer
 *@param hash_size hase值buffer的长度,hash_size >= hash_length
 *@param hash_length 根据算法实际返回的hash长度。
 *@return = 0,success; = 1 fail.
 *
 */
DS_SHA_STATUS DS_hash_compute(SHA_Type_t type,
                                const uint8_t *input, size_t input_length,
                                uint8_t *hash, size_t hash_size,
                                size_t *hash_length );

/*

 *@brief 单个数据流进行hash比较，支持sha1,sha224,sha256,sha384,sha512,
 *@brief 暂不支持sha3_256,sha3_512等算法
 *@param type  hash算法类型，支持sha1,sha224,sha256,sha384,sha512。
 *@param input 待hash的数据buffer
 *@param input_length hash的数据长度
 *@param hash hash值buffer
 *@param hash_length 根据算法实际返回的hash长度。
 *@return = 0,success,数据源真实性; = 1 fail，数据被篡改.
 *
 *
 */
DS_SHA_STATUS DS_hash_compare(SHA_Type_t type,
                                const uint8_t *input, size_t input_length,
                                uint8_t *hash, size_t hash_length);



/*
 *@brief 数据流操作初始化
 *
 *
 */
void DS_hash_stream_operation_init(psa_hash_operation_t * operation, SHA_Type_t type);


/*
 *@brief 数据流进行块hash计算
 *@param input: 输入数据
 *@param input_length: 数据的长度
 */
DS_SHA_STATUS DS_hash_stream_update( psa_hash_operation_t *operation,
                                    const uint8_t *input,
                                    size_t input_length );

/*
 *@brief hash对象克隆
 *
 *
 */
DS_SHA_STATUS DS_hash_stream_clone( const psa_hash_operation_t *source_operation,
                                   psa_hash_operation_t *target_operation );

/*
 *@brief 计算最终的hash值
 *@param hash: 返回operation操作过程中的hash值
 *@param hash_size: hash_size >= hash_lenght
 *@param hash_length: 返回当前操作hasn的长度
 */
DS_SHA_STATUS DS_hash_stream_finish( psa_hash_operation_t *operation,
                              uint8_t *hash,
                              size_t hash_size,
                              size_t *hash_length );

/*
 *@brief 比较hash值
 *@param hash hash数据buffer
 *@param hash_length  hash值的数据长度
 *
 *
 */
DS_SHA_STATUS DS_hash_stream_verify( psa_hash_operation_t *operation,
                              const uint8_t *hash,
                              size_t hash_length );





#endif /* DS_SHA_H_ */
